package ar.uade.distribuidas.tpo.dba.dominio;

import java.util.LinkedList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import ar.uade.distribuidas.tpo.base.dominiodto.ItemSolicitudDeCotizacionDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.SolicitudDeCotizacionDTO;

import com.google.common.collect.Lists;

@Entity
@Table(name = "solicitudesDeCotizacion")
public class SolicitudDeCotizacion {

	@Id
	private Long id;
	@ManyToOne
	@JoinColumn(name = "cliente_id")
	private Cliente cliente;
	private String fecha;
	@OneToMany(cascade = CascadeType.ALL)
	@JoinColumn(name = "solicitud_id")
	private List<ItemSolicitudDeCotizacion> items;

//	public static void main(String[] args) {
//		SolicitudDeCotizacion sc = new SolicitudDeCotizacion();
//		sc.setId(123L);
//		SolicitudDeCotizacionDAO scDAO = SolicitudDeCotizacionDAO.getInstance();
//		scDAO.persist(sc);
//	}

	public SolicitudDeCotizacion() {
		this.items = Lists.newLinkedList();
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long long1) {
		this.id = long1;
	}

	public String getFecha() {
		return fecha;
	}

	public void setFecha(String fecha) {
		this.fecha = fecha;
	}

	public List<ItemSolicitudDeCotizacion> getItems() {
		return items;
	}

	public void setItems(List<ItemSolicitudDeCotizacion> items) {
		this.items = items;
	}
	
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((cliente == null) ? 0 : cliente.hashCode());
		result = prime * result + ((fecha == null) ? 0 : fecha.hashCode());
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((items == null) ? 0 : items.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		SolicitudDeCotizacion other = (SolicitudDeCotizacion) obj;
		if (cliente == null) {
			if (other.cliente != null)
				return false;
		} else if (!cliente.equals(other.cliente))
			return false;
		if (fecha == null) {
			if (other.fecha != null)
				return false;
		} else if (!fecha.equals(other.fecha))
			return false;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (items == null) {
			if (other.items != null)
				return false;
		} else if (!items.equals(other.items))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "SolicitudDeCotizacion [id=" + id + ", cliente=" + cliente + ", fecha=" + fecha + ", items=" + items + "]";
	}

	public static SolicitudDeCotizacion fromDTO(SolicitudDeCotizacionDTO dto) {
		SolicitudDeCotizacion s = new SolicitudDeCotizacion();
		
		if(dto.getId()!=0)
			s.setId(dto.getId());
		s.setCliente(Cliente.fromDTO(dto.getCliente()));
		s.setFecha(dto.getFecha());
		List<ItemSolicitudDeCotizacion> itemsSol = new LinkedList<ItemSolicitudDeCotizacion>();
		s.setItems(itemsSol);
		
		for(ItemSolicitudDeCotizacionDTO itemDto : dto.getItems()){
			itemsSol.add(ItemSolicitudDeCotizacion.fromDTO(itemDto));
		}
		
		return s;
	}

	public SolicitudDeCotizacionDTO toDTO() {
		SolicitudDeCotizacionDTO dto = new SolicitudDeCotizacionDTO();
		dto.setId(this.id);
		dto.setCliente(this.cliente.toDTO());
		if(this.fecha!=null) {
			dto.setFecha(this.fecha);
		} else {
			dto.setFecha("");
		}
		List<ItemSolicitudDeCotizacionDTO> itemsDTO = Lists.newLinkedList();
		dto.setItems(itemsDTO);

		for (ItemSolicitudDeCotizacion i : this.items) {
			itemsDTO.add(i.toDTO());
		}

		return dto;
	}
}
